home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / zugabe / va45 / visual45 / library / extend / multirsc.s < prev    next >
Text File  |  1998-09-01  |  23KB  |  827 lines

  1. ;------------------------------------------------------------------------------
  2. ; Method name : -
  3. ; Asm label   : GWVA_RSC_SAVE_TREE
  4. ; Description : Sauvegarde paramétrable d'un arbre ressource dans un buffer
  5. ;
  6. ; Rq  : -
  7. ;
  8. ; in  : a0.l = 0 (MALLOC automatique) ou pointeur sur un précédent champ de sauvegarde
  9. ; in  : d0.w = index de l'arbre
  10. ; in  : d1.w = paramétre de la sauvegarde
  11. ;     GWVA_RSC_MASK_SAVE_STATE : sauve les objets RSC et le caractère des BOXCHAR
  12. ;     GWVA_RSC_MASK_SAVE_TEDINFO : sauve les TEDINFO
  13. ;     GWVA_RSC_MASK_SAVE_TEXT : sauve les textes non éditables sauf le caractère des icones
  14. ;     GWVA_RSC_MASK_SAVE_FTEXT : sauve les textes editables (texte+mise en forme+champ de saisie)
  15. ;     GWVA_RSC_MASK_SAVE_BITBLK : sauve les BITBLK
  16. ;     GWVA_RSC_MASK_SAVE_ICONBLK : sauve les ICONBLK
  17. ;     GWVA_RSC_MASK_SAVE_CICONBLK : sauve les CICONBLK
  18. ;     GWVA_RSC_MASK_SAVE_APPLBLK : sauve les APPLBLK
  19. ; out : a0.l = pointeur sur le champ de sauvegarde
  20. ; out : d7.w = GWVA_NO_ERROR_GENERIC, ou erreur
  21. ;       GWVA_ERROR_MALLOC
  22. ;       GWVA_ERROR_RSC_NO_SAVE_PARAMETERS
  23. ;       GWVA_ERROR_RSC_NO_TREE_IDX
  24. ;       GWVA_ERROR_RSC_BUFFER_UNMATCH
  25. ;
  26. ; 23/05/98 : Création
  27. ;------------------------------------------------------------------------------
  28. GWVA_RSC_SAVE_TREE:
  29.     tst d1
  30.     beq .pas_de_parametres
  31.  
  32.     save.l d0-d1/a0
  33.     lea GWVA_RSC_TMP_ADD_TREE,a0
  34.     bsr GWVA_RSC_RETURN_PTR_ON_TREE
  35.     load.l d0-d1/a0
  36.  
  37.     cmp.l #0,a0
  38.     beq.s .faire_un_malloc
  39.  
  40.     cmp.w GWVA_RSC_SAVE_TREE_IDX(a0),d0
  41.     bne .pas_le_meme_tree
  42.  
  43.     cmp.w GWVA_RSC_SAVE_PARAMETERS(a0),d1
  44.     bne .pas_les_memes_parametres
  45.  
  46.     bra.s .deja_un_malloc
  47.  
  48. .faire_un_malloc:
  49.  
  50.     move.w d1,GWVA_RSC_TMP_SAVE_PARAMETERS
  51.     clr.l GWVA_RSC_TMP_SIZE
  52.  
  53.     save.w d0
  54.     move.l GWVA_RSC_TMP_ADD_TREE,a0        ; a0.l : adresse de base de l'arbre
  55.     move.l #GWVA_RSC_CALCULATE_SIZE_OBJECT,a1    ; a1.l : routine à executer à chaque objet
  56.     move.l a0,a2            ; a2.l : adresse de l'objet courant
  57.     clr.w d0                ; d0.w : numéro courant
  58.     moveq #-1,d1            ; d1.w : numéro du pére du root
  59.     bsr GWVA_RSC_GO_OVER_TREE
  60.     load.w d0
  61.  
  62.     save.w d0
  63.     move.l GWVA_RSC_TMP_SIZE,d0
  64.     add.l #GWVA_RSC_SAVE_HEADER_LENGTH,d0
  65.  
  66.     MXALLOC #MX_PREFTTRAM,d0
  67.     move.l d0,a0
  68.     load.w d0
  69.     cmp.l #0,a0
  70.     beq.s .pas_de_memoire
  71.  
  72.     move.w d0,GWVA_RSC_SAVE_TREE_IDX(a0)
  73.     move.w GWVA_RSC_TMP_SAVE_PARAMETERS,GWVA_RSC_SAVE_PARAMETERS(a0)
  74.     move.l GWVA_RSC_TMP_SIZE,GWVA_RSC_SAVE_SIZE(a0)
  75.     
  76. .deja_un_malloc:
  77.  
  78.     move.l a0,GWVA_RSC_TMP_SAVE_PTR
  79.     add.l #GWVA_RSC_SAVE_HEADER_LENGTH,GWVA_RSC_TMP_SAVE_PTR
  80.  
  81.     save.l a0
  82.  
  83.     move.l GWVA_RSC_TMP_ADD_TREE,a0    ; a0.l : adresse de base de l'arbre
  84.     move.l #GWVA_RSC_SAVE_OBJECT,a1    ; a1.l : routine à executer à chaque objet
  85.     move.l a0,a2            ; a2.l : adresse de l'objet courant
  86.     clr.w d0                ; d0.w : numéro courant
  87.     moveq #-1,d1            ; d1.w : numéro du pére du root
  88.     bsr GWVA_RSC_GO_OVER_TREE
  89.  
  90.     load.l a0
  91.  
  92.     move.w #GWVA_NO_ERROR_GENERIC,d7
  93.     rts
  94.  
  95. .pas_le_meme_tree:
  96. .pas_les_memes_parametres:
  97.     move.w #GWVA_ERROR_RSC_BUFFER_UNMATCH,d7
  98.     rts
  99. .pas_de_tree:
  100.     move.w #GWVA_ERROR_RSC_NO_TREE_IDX,d7
  101.     rts
  102. .pas_de_parametres:
  103.     move.w #GWVA_ERROR_RSC_NO_SAVE_PARAMETERS,d7
  104.     rts
  105. .pas_de_memoire:
  106.     move.w #GWVA_ERROR_MALLOC,d7
  107.     rts
  108.  
  109. ;------------------------------------------------------------------------------
  110. ; Method name : -
  111. ; Asm label   : GWVA_RSC_CALCULATE_SIZE_OBJECT
  112. ; Description : Calcul la taille à sauvegarder de l'objet RSC en fonction des
  113. ; Description : paramètres voulues
  114. ;
  115. ; Rq  : -
  116. ;
  117. ; in  : a2.l = pointeur sur l'objet RSC courant
  118. ; in  : GWVA_RSC_TMP_SAVE_PARAMETER
  119. ; in  : GWVA_RSC_TMP_SIZE
  120. ; out : GWVA_RSC_TMP_SIZE
  121. ; out : d7.w = GWVA_RSC_CTE_CONTINUE_GO_OVER
  122. ;
  123. ; 23/05/98 : Création
  124. ;------------------------------------------------------------------------------
  125. GWVA_RSC_CALCULATE_SIZE_OBJECT:
  126.  
  127.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_STATE:1}
  128.     beq.s .pas_objet_de_base
  129.  
  130.     add.l #L_OBJECT,GWVA_RSC_TMP_SIZE    ; + moi
  131. .pas_objet_de_base:
  132.  
  133.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_TEDINFO:1}
  134.     beq.s .pas_TEDINFO
  135.  
  136.     move.l a2,a0
  137.     bsr GWVA_RSC_TEST_IF_TEDINFO_STRUCT_EXIST
  138.     cmp.w #GWVA_ERROR_GENERIC,d7
  139.     beq.s .pas_TEDINFO
  140.  
  141.     add.l #L_TEDINFO,GWVA_RSC_TMP_SIZE
  142. .pas_TEDINFO:
  143.  
  144.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_TEXT:1}
  145.     beq.s .pas_texte_normal
  146.  
  147.     cmp.w #G_TEXT,ob_type(a2)
  148.     beq.s .taille_texte_normal_tedinfo
  149.     cmp.w #G_BOXTEXT,ob_type(a2)
  150.     bne.s .pas_texte_normal_text
  151. .taille_texte_normal_tedinfo:
  152.     move.w ([a2,ob_spec],te_txtlen),d0
  153.     ext.l d0
  154.     add.l d0,GWVA_RSC_TMP_SIZE
  155. .pas_texte_normal_text:
  156.  
  157.     cmp.w #G_BUTTON,ob_type(a2)
  158.     beq.s .taille_texte_normal_string
  159.     cmp.w #G_TITLE,ob_type(a2)
  160.     beq.s .taille_texte_normal_string
  161.     cmp.w #G_STRING,ob_type(a2)
  162.     bne.s .pas_taille_texte_normal_string
  163. .taille_texte_normal_string:
  164.     move.l ob_spec(a2),a0
  165.     bsr GWVA_COUNT_BYTES_0
  166.     add.l #1,d0        ; + 0.b
  167.     add.l d0,GWVA_RSC_TMP_SIZE
  168. .pas_taille_texte_normal_string:
  169.  
  170.     cmp.w #G_BOXCHAR,ob_type(a2)
  171.     bne.s .pas_texte_normal_boxchar
  172.     add.l #1,GWVA_RSC_TMP_SIZE
  173. .pas_texte_normal_boxchar:
  174. .pas_texte_normal:
  175.  
  176.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_FTEXT:1}
  177.     beq.s .pas_texte_editable
  178.  
  179.     cmp.w #G_FTEXT,ob_type(a2)
  180.     beq.s .taille_texte_editable_tedinfo
  181.     cmp.w #G_FBOXTEXT,ob_type(a2)
  182.     bne.s .pas_texte_editable_text
  183. .taille_texte_editable_tedinfo:
  184.     move.w ([a2,ob_spec],te_txtlen),d0
  185.     ext.l d0
  186.     add.l d0,GWVA_RSC_TMP_SIZE
  187.     move.w ([a2,ob_spec],te_tmplen),d0
  188.     ext.l d0
  189.     add.l d0,GWVA_RSC_TMP_SIZE
  190.     add.l d0,GWVA_RSC_TMP_SIZE
  191. .pas_texte_editable_text:
  192. .pas_texte_editable:
  193.  
  194.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_BITBLK:1}
  195.     beq.s .pas_BITBLK
  196.  
  197.     moveq #L_BITBLK,d0
  198.     cmp.w #G_IMAGE,ob_type(a2)
  199.     bne.s .pas_image
  200.     add.l d0,GWVA_RSC_TMP_SIZE
  201. .pas_image:
  202. .pas_BITBLK:
  203.  
  204.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_ICONBLK:1}
  205.     beq.s .pas_ICONBLK
  206.  
  207.     moveq #L_ICONBLK,d0
  208.     cmp.w #G_ICON,ob_type(a2)
  209.     bne.s .pas_icon
  210.     add.l d0,GWVA_RSC_TMP_SIZE
  211. .pas_icon:
  212. .pas_ICONBLK:
  213.  
  214.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_CICONBLK:1}
  215.     beq.s .pas_CICONBLK
  216.  
  217.     moveq #L_CICONBLK,d0
  218.     cmp.w #G_CICON,ob_type(a2)
  219.     bne.s .pas_cicon
  220.     add.l d0,GWVA_RSC_TMP_SIZE
  221. .pas_cicon:
  222. .pas_CICONBLK:
  223.  
  224.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_APPLBLK:1}
  225.     beq.s .pas_APPLBLK
  226.  
  227.     moveq #L_APPLBLK,d0
  228.     cmp.w #G_PROGDEF,ob_type(a2)
  229.     bne.s .pas_progdef
  230.     add.l d0,GWVA_RSC_TMP_SIZE
  231. .pas_progdef:
  232. .pas_APPLBLK:
  233.  
  234.     move.w #GWVA_RSC_CTE_CONTINUE_GO_OVER,d7
  235.     rts
  236.  
  237. ;------------------------------------------------------------------------------
  238. ; Method name : -
  239. ; Asm label   : GWVA_RSC_SAVE_OBJECT
  240. ; Description : Sauvegarde l'objet RSC en fonction des paramètres voulues
  241. ;
  242. ; Rq  : -
  243. ;
  244. ; in  : a2.l = pointeur sur l'objet RSC courant
  245. ; in  : GWVA_RSC_TMP_SAVE_PARAMETER
  246. ; in  : GWVA_RSC_TMP_SAVE_PTR
  247. ; out : d7.w = GWVA_RSC_CTE_CONTINUE_GO_OVER
  248. ;
  249. ; 23/05/98 : Création
  250. ;------------------------------------------------------------------------------
  251. GWVA_RSC_SAVE_OBJECT:
  252.  
  253.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_STATE:1}
  254.     beq.s .pas_objet_de_base
  255.  
  256.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  257.     move.l a2,a4
  258.     move.w #L_OBJECT/2-1,d0
  259. .recop_obj:    move.w (a4)+,(a3)+
  260.     dbf d0,.recop_obj
  261.     move.l a3,GWVA_RSC_TMP_SAVE_PTR
  262. .pas_objet_de_base:
  263.  
  264.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_TEDINFO:1}
  265.     beq.s .pas_TEDINFO
  266.  
  267.     move.l a2,a0
  268.     bsr GWVA_RSC_TEST_IF_TEDINFO_STRUCT_EXIST
  269.     cmp.w #GWVA_ERROR_GENERIC,d7
  270.     beq.s .pas_TEDINFO
  271.  
  272.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  273.     move.l ob_spec(a2),a4
  274.     move.w #L_TEDINFO/2-1,d0
  275. .recop_tedinfo:
  276.     move.w (a4)+,(a3)+
  277.     dbf d0,.recop_tedinfo
  278.     move.l a3,GWVA_RSC_TMP_SAVE_PTR
  279. .pas_TEDINFO:
  280.  
  281.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_TEXT:1}
  282.     beq.s .pas_texte_normal
  283.  
  284.     cmp.w #G_TEXT,ob_type(a2)
  285.     beq.s .texte_normal_tedinfo
  286.     cmp.w #G_BOXTEXT,ob_type(a2)
  287.     bne.s .pas_texte_normal_tedinfo
  288. .texte_normal_tedinfo:
  289.  
  290.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  291.     move.l ob_spec(a2),a4
  292.     move.w te_txtlen(a4),d0
  293.     move.l te_ptext(a4),a4
  294.     sub.w #1,d0
  295.     bmi.s .pas_texte_normal_tedinfo
  296. .recop_texte_normal_tedinfo:
  297.     move.b (a4)+,(a3)+
  298.     dbf d0,.recop_texte_normal_tedinfo
  299.     move.l a3,GWVA_RSC_TMP_SAVE_PTR
  300. .pas_texte_normal_tedinfo:
  301.  
  302.     cmp.w #G_BUTTON,ob_type(a2)
  303.     beq.s .texte_normal_string
  304.     cmp.w #G_TITLE,ob_type(a2)
  305.     beq.s .texte_normal_string
  306.     cmp.w #G_STRING,ob_type(a2)
  307.     bne.s .pas_texte_normal_string
  308. .texte_normal_string:
  309.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  310.     move.l ob_spec(a2),a4
  311.     COPY_STRING_0 a4,a3
  312.     move.l a3,GWVA_RSC_TMP_SAVE_PTR
  313. .pas_texte_normal_string:
  314.  
  315.     cmp.w #G_BOXCHAR,ob_type(a2)
  316.     bne.s .pas_texte_normal_boxchar
  317.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  318.     move.b ob_spec(a2),(a3)+
  319.     move.l a3,GWVA_RSC_TMP_SAVE_PTR
  320. .pas_texte_normal_boxchar:
  321. .pas_texte_normal:
  322.  
  323.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_FTEXT:1}
  324.     beq.s .pas_texte_editable
  325.  
  326.     cmp.w #G_FTEXT,ob_type(a2)
  327.     beq.s .texte_editable_tedinfo
  328.     cmp.w #G_FBOXTEXT,ob_type(a2)
  329.     bne.s .pas_texte_editable_text
  330. .texte_editable_tedinfo:
  331.  
  332.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  333.  
  334.     move.l ob_spec(a2),a4
  335.     move.w te_txtlen(a4),d0
  336.     move.l te_ptext(a4),a4
  337.     sub.w #1,d0
  338.     bmi.s .pas_texte_editable_tedinfo_txt
  339. .recop_texte_editable_tedinfo_txt:
  340.     move.b (a4)+,(a3)+
  341.     dbf d0,.recop_texte_editable_tedinfo_txt
  342. .pas_texte_editable_tedinfo_txt:
  343.     move.l ob_spec(a2),a4
  344.     move.w te_tmplen(a4),d0
  345.     move.l te_pvalid(a4),a5
  346.     move.l te_ptmplt(a4),a4
  347.     sub.w #1,d0
  348.     bmi.s .pas_texte_editable_tedinfo_tmplt_valid
  349. .recop_texte_editable_tedinfo_tmplt_valid:
  350.     move.b (a4)+,(a3)+
  351.     move.b (a5)+,(a3)+
  352.     dbf d0,.recop_texte_editable_tedinfo_tmplt_valid
  353. .pas_texte_editable_tedinfo_tmplt_valid:
  354.  
  355.     move.l a3,GWVA_RSC_TMP_SAVE_PTR
  356.  
  357. .pas_texte_editable_text:
  358. .pas_texte_editable:
  359.  
  360.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_BITBLK:1}
  361.     beq.s .pas_BITBLK
  362.  
  363.     cmp.w #G_IMAGE,ob_type(a2)
  364.     bne.s .pas_image
  365.  
  366.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  367.     move.l ob_spec(a2),a4
  368.     move.w #L_BITBLK/2-1,d0
  369. .recop_bitblk:
  370.     move.w (a4)+,(a3)+
  371.     dbf d0,.recop_bitblk
  372.     move.l a3,GWVA_RSC_TMP_SAVE_PTR
  373. .pas_image:
  374. .pas_BITBLK:
  375.  
  376.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_ICONBLK:1}
  377.     beq.s .pas_ICONBLK
  378.  
  379.     cmp.w #G_ICON,ob_type(a2)
  380.     bne.s .pas_icon
  381.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  382.     moveq #L_ICONBLK/2-1,d0
  383. .recop_iconblk:
  384.     move.w (a4)+,(a3)+
  385.     dbf d0,.recop_iconblk
  386.     move.l a3,GWVA_RSC_TMP_SAVE_PTR
  387. .pas_icon:
  388. .pas_ICONBLK:
  389.  
  390.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_CICONBLK:1}
  391.     beq.s .pas_CICONBLK
  392.  
  393.     cmp.w #G_CICON,ob_type(a2)
  394.     bne.s .pas_cicon
  395.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  396.     moveq #L_CICONBLK/2-1,d0
  397. .recop_ciconblk:
  398.     move.w (a4)+,(a3)+
  399.     dbf d0,.recop_ciconblk
  400.     move.l a3,GWVA_RSC_TMP_SAVE_PTR
  401. .pas_cicon:
  402. .pas_CICONBLK:
  403.  
  404.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_APPLBLK:1}
  405.     beq.s .pas_APPLBLK
  406.  
  407.     cmp.w #G_PROGDEF,ob_type(a2)
  408.     bne.s .pas_progdef
  409.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  410.     moveq #L_APPLBLK/2-1,d0
  411. .recop_applblk:
  412.     move.w (a4)+,(a3)+
  413.     dbf d0,.recop_applblk
  414.     move.l a3,GWVA_RSC_TMP_SAVE_PTR
  415. .pas_progdef:
  416. .pas_APPLBLK:
  417.  
  418.     move.w #GWVA_RSC_CTE_CONTINUE_GO_OVER,d7
  419.     rts
  420.  
  421. ;------------------------------------------------------------------------------
  422. ; Method name : -
  423. ; Asm label   : GWVA_RSC_RESTORE_TREE
  424. ; Description : Restauration d'un arbre ressource précédement sauvegardé
  425. ;
  426. ; Rq  : -
  427. ;
  428. ; in  : a0.l = pointeur sur un champ de sauvegarde
  429. ; in  : d0.w = paramétre de la restauration
  430. ;     GWVA_RSC_MASK_SAVE_STATE : sauve les objets RSC et le caractère des BOXCHAR
  431. ;     GWVA_RSC_MASK_SAVE_TEDINFO : sauve les TEDINFO
  432. ;     GWVA_RSC_MASK_SAVE_TEXT : sauve les textes non éditables sauf le caractère des icones
  433. ;     GWVA_RSC_MASK_SAVE_FTEXT : sauve les textes editables (texte+mise en forme+champ de saisie)
  434. ;     GWVA_RSC_MASK_SAVE_BITBLK : sauve les BITBLK
  435. ;     GWVA_RSC_MASK_SAVE_ICONBLK : sauve les ICONBLK
  436. ;     GWVA_RSC_MASK_SAVE_CICONBLK : sauve les CICONBLK
  437. ;     GWVA_RSC_MASK_SAVE_APPLBLK : sauve les APPLBLK
  438. ; out : d7.w = GWVA_NO_ERROR_GENERIC, ou erreur
  439. ;       GWVA_ERROR_GENERIC si on demande de restaurer des informations non sauvegardées
  440. ;
  441. ; 23/05/98 : Création
  442. ;------------------------------------------------------------------------------
  443. GWVA_RSC_RESTORE_TREE:
  444.  
  445.     tst.w d0
  446.     beq.s .pas_de_restauration
  447.  
  448.     move.w GWVA_RSC_SAVE_PARAMETERS(a0),d1    ; paramètres de sauvegarde
  449.     or.w d0,d1
  450.     cmp.w GWVA_RSC_SAVE_PARAMETERS(a0),d1
  451.     bne.s .restauration_impossible        ; on demande de restaurer des choses non sauvegardées
  452.  
  453.     save.l a0/d0
  454.     move.w GWVA_RSC_SAVE_TREE_IDX(a0),d0
  455.     lea GWVA_RSC_TMP_ADD_TREE,a0
  456.     bsr GWVA_RSC_RETURN_PTR_ON_TREE
  457.     load.l a0/d0
  458.  
  459.     move.w d0,GWVA_RSC_TMP_RESTORE_PARAMETER
  460.     move.w GWVA_RSC_SAVE_PARAMETERS(a0),GWVA_RSC_TMP_SAVE_PARAMETERS        ; d2 paramètres de sauvegarde
  461.     move.l a0,GWVA_RSC_TMP_SAVE_PTR
  462.     add.l #GWVA_RSC_SAVE_HEADER_LENGTH,GWVA_RSC_TMP_SAVE_PTR
  463.  
  464.     save.l a0
  465.     move.l GWVA_RSC_TMP_ADD_TREE,a0    ; adresse de base de l'arbre
  466.     move.l #GWVA_RSC_RESTORE_OBJECT,a1    ; routine à executer à chaque objet
  467.     move.l a0,a2
  468.     clr.w d0            ; numéro courant
  469.     moveq #-1,d1        ; numéro du pére du root
  470.     bsr GWVA_RSC_GO_OVER_TREE
  471.     load.l a0
  472.  
  473. .pas_de_restauration:
  474.     moveq #GWVA_NO_ERROR_GENERIC,d7
  475.     rts
  476.  
  477. .restauration_impossible:
  478.     move.w #GWVA_ERROR_GENERIC,d7
  479.     rts
  480.  
  481. ;------------------------------------------------------------------------------
  482. ; Method name : -
  483. ; Asm label   : GWVA_RSC_RESTORE_OBJECT
  484. ; Description : Restaure l'objet RSC en fonction des paramètres voulues
  485. ;
  486. ; Rq  : -
  487. ;
  488. ; in  : a2.l = pointeur sur l'objet RSC courant
  489. ; in  : GWVA_RSC_TMP_SAVE_PARAMETER
  490. ; in  : GWVA_RSC_TMP_RESTORE_PARAMETER
  491. ; in  : GWVA_RSC_TMP_SAVE_PTR
  492. ; out : d7.w = GWVA_RSC_CTE_CONTINUE_GO_OVER
  493. ;
  494. ; 23/05/98 : Création
  495. ;------------------------------------------------------------------------------
  496. GWVA_RSC_RESTORE_OBJECT:
  497.  
  498.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_STATE:1}
  499.     beq.s .pas_sauve_objet_de_base    ; l'objet de base a-t-il été sauvé ?
  500.  
  501.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  502.     add.l #L_OBJECT,GWVA_RSC_TMP_SAVE_PTR
  503.  
  504.     bftst GWVA_RSC_TMP_RESTORE_PARAMETER{GWVA_RSC_OLBIT_SAVE_STATE:1}
  505.     beq.s .pas_restaure_objet_de_base    ; l'objet de base doit-il être restauré
  506.  
  507.     move.l a2,a4
  508.     move.w #L_OBJECT/2-1,d0
  509. .recop_obj:    move.w (a3)+,(a4)+
  510.     dbf d0,.recop_obj
  511. .pas_restaure_objet_de_base:
  512. .pas_sauve_objet_de_base:
  513.  
  514. ;----
  515.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_TEDINFO:1}
  516.     beq.s .pas_sauve_TEDINFO    ; la structure TEDINFO a-t-elle été sauvée
  517.  
  518.     move.l a2,a0
  519.     bsr GWVA_RSC_TEST_IF_TEDINFO_STRUCT_EXIST
  520.     cmp.w #GWVA_ERROR_GENERIC,d7
  521.     beq.s .pas_TEDINFO
  522.  
  523.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  524.     add.l #L_TEDINFO,GWVA_RSC_TMP_SAVE_PTR
  525.  
  526.     bftst GWVA_RSC_TMP_RESTORE_PARAMETER{GWVA_RSC_OLBIT_SAVE_TEDINFO:1}
  527.     beq.s .pas_restaure_TEDINFO    ; doit-elle être restaurée
  528.  
  529.     move.l ob_spec(a2),a4
  530.     move.w #L_TEDINFO/2-1,d0
  531. .recop_tedinfo:
  532.     move.w (a3)+,(a4)+
  533.     dbf d0,.recop_tedinfo
  534.  
  535. .pas_restaure_TEDINFO:
  536. .pas_TEDINFO:
  537. .pas_sauve_TEDINFO:
  538.  
  539. ;----
  540.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_TEXT:1}
  541.     beq .pas_sauve_texte_normal    ; les textes normaux ont-ils été sauvés
  542.  
  543.     cmp.w #G_TEXT,ob_type(a2)
  544.     beq.s .texte_normal_tedinfo
  545.     cmp.w #G_BOXTEXT,ob_type(a2)
  546.     bne.s .pas_texte_normal_tedinfo
  547. .texte_normal_tedinfo:
  548.  
  549.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  550.     move.l ob_spec(a2),a4
  551.     move.w te_txtlen(a4),d0
  552.     ext.l d0
  553.     add.l d0,GWVA_RSC_TMP_SAVE_PTR
  554.  
  555.     bftst GWVA_RSC_TMP_RESTORE_PARAMETER{GWVA_RSC_OLBIT_SAVE_TEXT:1}
  556.     beq.s .pas_restaure_texte_normal_tedinfo    ; doivent-ils être restaurés
  557.  
  558.     move.l te_ptext(a4),a4
  559.     sub.w #1,d0
  560.     bmi.s .pas_restaure_texte_normal_tedinfo
  561. .recop_texte_normal_tedinfo:
  562.     move.b (a3)+,(a4)+
  563.     dbf d0,.recop_texte_normal_tedinfo
  564.     bra.s .pas_restaure_texte_normal_tedinfo
  565.  
  566. .pas_texte_normal_tedinfo:
  567.     cmp.w #G_BUTTON,ob_type(a2)
  568.     beq.s .texte_normal_string
  569.     cmp.w #G_TITLE,ob_type(a2)
  570.     beq.s .texte_normal_string
  571.     cmp.w #G_STRING,ob_type(a2)
  572.     bne.s .pas_texte_normal_string
  573. .texte_normal_string:
  574.  
  575.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  576.     move.l a3,a0
  577.     bsr GWVA_COUNT_BYTES_0
  578.     add.l #1,d0
  579.     add.l d0,GWVA_RSC_TMP_SAVE_PTR
  580.  
  581.     bftst GWVA_RSC_TMP_RESTORE_PARAMETER{GWVA_RSC_OLBIT_SAVE_TEXT:1}
  582.     beq.s .pas_restaure_texte_normal_string    ; doivent-ils être restaurés
  583.  
  584.     move.l ob_spec(a2),a4
  585.     COPY_STRING_0 a3,a4
  586.     bra.s .pas_restaure_texte_normal_string
  587.  
  588. .pas_texte_normal_string:
  589.  
  590.     cmp.w #G_BOXCHAR,ob_type(a2)
  591.     bne.s .pas_texte_normal_boxchar
  592.  
  593.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  594.     add.l #1,GWVA_RSC_TMP_SAVE_PTR
  595.  
  596.     bftst GWVA_RSC_TMP_RESTORE_PARAMETER{GWVA_RSC_OLBIT_SAVE_TEXT:1}
  597.     beq.s .pas_restaure_texte_normal_boxchar    ; doivent-ils être restaurés
  598.  
  599.     move.b (a3)+,ob_spec(a2)
  600.  
  601. .pas_restaure_texte_normal_boxchar:
  602. .pas_restaure_texte_normal_string:
  603. .pas_restaure_texte_normal_tedinfo
  604. .pas_texte_normal_boxchar:
  605. .pas_sauve_texte_normal:
  606.  
  607. ;----
  608.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_FTEXT:1}
  609.     beq.s .pas_sauve_texte_editable    ; les textes éditables ont-ils été sauvés
  610.  
  611.     cmp.w #G_FTEXT,ob_type(a2)
  612.     beq.s .texte_editable_tedinfo
  613.     cmp.w #G_FBOXTEXT,ob_type(a2)
  614.     bne.s .pas_texte_editable
  615. .texte_editable_tedinfo:
  616.  
  617.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  618.  
  619.     move.l ob_spec(a2),a4
  620.     move.w te_txtlen(a4),d0
  621.     ext.l d0
  622.     add.l d0,GWVA_RSC_TMP_SAVE_PTR
  623.     move.w te_tmplen(a4),d0
  624.     ext.l d0
  625.     add.l d0,d0
  626.     add.l d0,GWVA_RSC_TMP_SAVE_PTR
  627.  
  628.     bftst GWVA_RSC_TMP_RESTORE_PARAMETER{GWVA_RSC_OLBIT_SAVE_FTEXT:1}
  629.     beq.s .pas_restaure_texte_editable    ; doivent-ils être restaurés
  630.  
  631.     move.l ob_spec(a2),a4
  632.     move.w te_txtlen(a4),d0
  633.     move.l te_ptext(a4),a4
  634.     sub.w #1,d0
  635.     bmi.s .pas_restaure_texte_editable_tedinfo_txt
  636. .recop_texte_editable_tedinfo_txt:
  637.     move.b (a3)+,(a4)+
  638.     dbf d0,.recop_texte_editable_tedinfo_txt
  639. .pas_restaure_texte_editable_tedinfo_txt:
  640.     move.l ob_spec(a2),a4
  641.     move.w te_tmplen(a4),d0
  642.     move.l te_pvalid(a4),a5
  643.     move.l te_ptmplt(a4),a4
  644.     sub.w #1,d0
  645.     bmi.s .pas_restaure_texte_editable_tedinfo_tmplt_valid
  646. .recop_texte_editable_tedinfo_tmplt_valid:
  647.     move.b (a3)+,(a4)+
  648.     move.b (a3)+,(a5)+
  649.     dbf d0,.recop_texte_editable_tedinfo_tmplt_valid
  650. .pas_restaure_texte_editable_tedinfo_tmplt_valid
  651.  
  652. .pas_restaure_texte_editable:
  653. .pas_texte_editable:
  654. .pas_sauve_texte_editable:
  655.  
  656. ;----
  657.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_BITBLK:1}
  658.     beq.s .pas_sauve_bitblk        ; les structures BITBLK ont-elles été sauvées
  659.  
  660.     cmp.w #G_IMAGE,ob_type(a2)
  661.     bne.s .pas_bitblk
  662.  
  663.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  664.     add.l #L_BITBLK,GWVA_RSC_TMP_SAVE_PTR
  665.  
  666.     bftst GWVA_RSC_TMP_RESTORE_PARAMETER{GWVA_RSC_OLBIT_SAVE_BITBLK:1}
  667.     beq.s .pas_restaure_bitblk    ; doivent-elles être restaurées
  668.  
  669.     move.l ob_spec(a2),a4
  670.     move.w #L_BITBLK/2-1,d0
  671. .recop_bitblk:
  672.     move.w (a3)+,(a4)+
  673.     dbf d0,.recop_bitblk
  674. .pas_restaure_bitblk:
  675. .pas_bitblk:
  676. .pas_sauve_bitblk:
  677.  
  678. ;----
  679.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_ICONBLK:1}
  680.     beq.s .pas_sauve_iconblk        ; les structures ICONBLK ont-elles été sauvées
  681.  
  682.     cmp.w #G_ICON,ob_type(a2)
  683.     bne.s .pas_iconblk
  684.  
  685.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  686.     add.l #L_ICONBLK,GWVA_RSC_TMP_SAVE_PTR
  687.  
  688.     bftst GWVA_RSC_TMP_RESTORE_PARAMETER{GWVA_RSC_OLBIT_SAVE_ICONBLK:1}
  689.     beq.s .pas_restaure_iconblk        ; doivent-elles être restaurées
  690.  
  691.     move.l ob_spec(a2),a4
  692.     moveq #L_ICONBLK/2-1,d0
  693. .recop_iconblk:
  694.     move.w (a3)+,(a4)+
  695.     dbf d0,.recop_iconblk
  696. .pas_restaure_iconblk:
  697. .pas_iconblk:
  698. .pas_sauve_iconblk:
  699.  
  700. ;----
  701.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_CICONBLK:1}
  702.     beq.s .pas_sauve_ciconblk        ; les structures CICONBLK ont-elles été sauvées
  703.  
  704.     cmp.w #G_CICON,ob_type(a2)
  705.     bne.s .pas_ciconblk
  706.  
  707.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  708.     add.l #L_CICONBLK,GWVA_RSC_TMP_SAVE_PTR
  709.  
  710.     bftst GWVA_RSC_TMP_RESTORE_PARAMETER{GWVA_RSC_OLBIT_SAVE_CICONBLK:1}
  711.     beq.s .pas_restaure_ciconblk        ; doivent-elles être restaurées
  712.  
  713.     move.l ob_spec(a2),a4
  714.     moveq #L_CICONBLK/2-1,d0
  715. .recop_ciconblk:
  716.     move.w (a3)+,(a4)+
  717.     dbf d0,.recop_ciconblk
  718.  
  719. .pas_restaure_ciconblk:
  720. .pas_ciconblk:
  721. .pas_sauve_ciconblk:
  722.  
  723. ;----
  724.     bftst GWVA_RSC_TMP_SAVE_PARAMETERS{GWVA_RSC_OLBIT_SAVE_APPLBLK:1}
  725.     beq.s .pas_sauve_applblk        ; les structures APPLBLK ont-elles été sauvées
  726.  
  727.     cmp.w #G_PROGDEF,ob_type(a2)
  728.     bne.s .pas_applblk
  729.  
  730.     move.l GWVA_RSC_TMP_SAVE_PTR,a3
  731.     add.l #L_APPLBLK,GWVA_RSC_TMP_SAVE_PTR
  732.  
  733.     bftst GWVA_RSC_TMP_RESTORE_PARAMETER{GWVA_RSC_OLBIT_SAVE_APPLBLK:1}
  734.     beq.s .pas_restaure_applblk        ; doivent-elles être restaurées
  735.  
  736.     move.l ob_spec(a2),a4
  737.     moveq #L_APPLBLK/2-1,d0
  738. .recop_applblk:
  739.     move.w (a3)+,(a4)+
  740.     dbf d0,.recop_applblk
  741. .pas_restaure_applblk:
  742. .pas_applblk:
  743. .pas_sauve_applblk:
  744.  
  745.     move.w #GWVA_RSC_CTE_CONTINUE_GO_OVER,d7
  746.     rts
  747.  
  748. ;------------------------------------------------------------------------------
  749. ; Method name : -
  750. ; Asm label   : GWVA_RSC_COPY_SAVED_TREE
  751. ; Description : Duplique la sauvegarde d'un arbre ressource
  752. ;
  753. ; Rq  : -
  754. ;
  755. ; in  : a0.l = pointeur sur la sauvegarde source
  756. ; in  : a1.l = 0 (création de la copie par mxalloc) ou adresse d'un buffer de destination
  757. ; out : a0.l = pointeur sur la sauvegarde destination
  758. ; out : d7.w = GWVA_NO_ERROR_GENERIC ou GWVA_ERROR_MALLOC
  759. ;
  760. ; 06/06/98 : Création
  761. ;------------------------------------------------------------------------------
  762. GWVA_RSC_COPY_SAVED_TREE:
  763.  
  764.     cmp.l #0,a1
  765.     bne.s .pas_de_malloc
  766.  
  767.     save.l a0
  768.     move.l GWVA_RSC_SAVE_SIZE(a0),d0
  769.     add.l #GWVA_RSC_SAVE_HEADER_LENGTH,d0
  770.     MXALLOC #MX_PREFTTRAM,d0
  771.     load.l a0
  772.  
  773.     tst.l d0
  774.     beq.s .pas_de_memoire
  775.     move.l d0,a1
  776.  
  777. .pas_de_malloc:
  778.  
  779.     save.l a1
  780.  
  781.     move.l GWVA_RSC_SAVE_SIZE(a0),d0
  782.     add.l #GWVA_RSC_SAVE_HEADER_LENGTH,d0
  783.     move.l d0,d1
  784.     asr.l #2,d1
  785. .recop_long:
  786.     beq.s .pas_de_mot_long
  787.     move.l (a0)+,(a1)+
  788.     sub.l #1,d1
  789.     bra.s .recop_long
  790. .pas_de_mot_long:
  791.     move.l d0,d1
  792.     and.l #%11,d1
  793.     asr.w #1,d1
  794.     beq.s .pas_de_mot
  795.     move.w (a0)+,(a1)+
  796. .pas_de_mot:
  797.     move.l d0,d1
  798.     and.l #%1,d1
  799.     beq.s .pas_de_octet
  800.     move.b (a0)+,(a1)+
  801. .pas_de_octet:
  802.  
  803.     load.l a0
  804.  
  805.     moveq #GWVA_NO_ERROR_GENERIC,d7
  806.     rts
  807. .pas_de_memoire:
  808.     move.w #GWVA_ERROR_MALLOC,d7
  809.     rts
  810.  
  811. ;------------------------------------------------------------------------------
  812.     rsreset
  813. GWVA_RSC_SAVE_TREE_IDX:        rs.w 1
  814. GWVA_RSC_SAVE_PARAMETERS:    rs.w 1
  815. GWVA_RSC_SAVE_SIZE:        rs.l 1
  816. GWVA_RSC_SAVE_HEADER_LENGTH:    rs.w 0
  817. ;------------------------------------------------------------------------------
  818.     BSS
  819.  
  820. GWVA_RSC_TMP_SIZE:        ds.l 1
  821. GWVA_RSC_TMP_SAVE_PARAMETERS:    ds.w 1
  822. GWVA_RSC_TMP_RESTORE_PARAMETER:    ds.w 1
  823. GWVA_RSC_TMP_SAVE_PTR:        ds.l 1
  824.  
  825. ;------------------------------------------------------------------------------
  826.     TEXT
  827.